> 10-10:15 写计划
> 10:20-11 go知识回顾
> 11:15-12 go学习练习
> 12:30-2

> 3-3:10   写计划

TODO
> 多任务
> 常用序列化
> 类型转化
> 分布式技术及开源组件
> k8s docker devops

ssh 文件
/etc/ssh/ssh_config
> 作为客户端进行ssh连接，如会影响到本机与github远程的交互
/etc/ssh/sshd_config
> 作为服务端进行ssh连接，如解决ssh超时断开问题
************************************************************
server_setup.sh
------------------------------------------------------------
#!/bin/bash

# ssh连接不断开
echo -e "ClientAliveInterval 30\nClientAliveCountMax 86400" >> /etc/ssh/sshd_config
------------------------------------------------------------
************************************************************

go
常用输出
> https://zhuanlan.zhihu.com/p/382681805
> Printf根据format参数生成格式化的字符串并写入标准输出。返回写入的字节数和遇到的任何错误
	>> 常用
	%v	值的默认格式表示
	%+v	类似%v，但输出结构体时会添加字段名
	%#v	值的Go语法表示
	%T	打印值的类型
  %s  字符串
> Print 使用%v模式输出
> Println 在Print基础上加上了换行
> FPrintln 和Println一样，但是可以输出到文件 FPrintf FPrint表现都是这样，第一个参数文件句柄

空接口类型
> 空接口类型可以接受任何类型数值，因为所有类型都实现了空接口
------------------------------------------------------------
func main() {
    var x interface{}
    x = 10
    value, ok := x.(int)
    fmt.Print(value, ",", ok)
}
------------------------------------------------------------

错误处理
> go只能通过一层一层判断error是否nil来进行错误处理，显得比较啰嗦

编译过程
> go是自举的
> 编译过程 源码->编译->链接->可执行文件->执行输出 跟C不同少了预处理过程

go技术栈
> 分布式技术及开源组件
> k8s docker devops

go文件处理
> https://blog.csdn.net/taokexia/article/details/106248135
************************************************************
> 创建
	>> Creat
------------------------------------------------------------
import "os"

func CreateFile(path string) {
    // 创建文件，返回两个值
    // 一个是创建的文件，另一个是错误信息
    f, er := os.Create(path)
    // 如果有错误，打印错误信息
    if err != null {
        fmt.Println("err=", err)
        return
    }
    defer f.Close() // 退出整个函数时关闭文件
}
func main() {
    var filePath = "a.txt"
    CreateFile(filePath)
}
------------------------------------------------------------
> 写入
	>> WriteString
------------------------------------------------------------
var str string
for i := 1; i < 10; i++ {
    // 写入文件
    str = fmt.Sprintf("i = %d\n", i)
    n, err := f.WriteString(str)
    if err != nil {
        fmt.Println(err)
    }
    fmt.Println(n)
}
------------------------------------------------------------
> 打开文件
	>> OpenFile
	三个参数 路径 模式 权限
		>>> 模式
		O_RDONLY(只读模式)
		O_WRONLY(只写模式),
		O_RDWR( 可读可写模式)
		O_APPEND(追加模式)
		>>> 权限
		0：没有任何权限
		1：执行权限 x(如果是可执行文件，是可以运行的)
		2：写权限 r
		3：写权限与执行权限 xr
		4：读权限 w
		5：读权限与执行权限 xw
		6：读权限与写权限 wr
		7：读权限，写权限，执行权限 xwr
	>> Open
	只读打开 参数 路径
		
> 读取
> 不同读取方式 https://www.jianshu.com/p/711c453bff16
	>> Read
	>> ReadBytes
	Read() 是将文件的内容全部读取出来，然后存放在切片中，我们也可以每次只读取一行数据。这需要用到bufio包中的 ReadBytes函数。

在使用 ReadBytes() 函数读取数据时，需要用到缓冲区,所谓缓冲区就是存储数据的区域，也就是先将从文件中读取的数据存储在该区域内，然后在将区域中的数据取出来，写到磁盘上。
提供缓冲区的原因是：为了缓和 CPU 与 磁盘设备之间速度不匹配矛盾。文件缓冲区是用以暂时存放读写期间的文件数据而在内存区预留的一定空间
------------------------------------------------------------
func Read1()  (string){
    //获得一个file
    f, err := os.Open("file/test")
    if err != nil {
        fmt.Println("read fail")
        return ""
    }

    //把file读取到缓冲区中
    defer f.Close()
    var chunk []byte
    buf := make([]byte, 1024)

    for {
        //从file读取到buf中
        n, err := f.Read(buf)
        if err != nil && err != io.EOF{
            fmt.Println("read buf fail", err)
            return ""
        }
        //说明读取结束
        if n == 0 {
            break
        }
        //读取到最终的缓冲区中
        chunk = append(chunk, buf[:n]...)
    }

    return string(chunk)
    //fmt.Println(string(chunk))
}
------------------------------------------------------------
	>> 使用bufio 多种方法
------------------------------------------------------------
func ReadLine(path) {
    // 打开文件
    f, err := os.Open(path)
    if err != nil {
        fmt.Println("err = ", err)
        return
    }
    // 关闭文件
    defer f.Close()
    // 创建缓冲区
    r := bufio.NewReader(f)
    // 循环读取文件内容，直到文件末尾
    for {
        // 遇到`\n`结束读取，但`\n`也读取进入
        buf, err != r.ReadBytes('\n')
        if err != nil {
            if err == io.EOF {
                // 文件已经结束
                break
            }
            fmt.Println("err = ", err)
        }
        fmt.Printf("buf = #%s#\n", string(buf))
    }
    
}
------------------------------------------------------------
************************************************************

git 配置gitee和github共存
> https://whghcyx.gitee.io/2020/01/06/%E5%AE%89%E8%A3%85-2020-01-06-Github%E4%B8%8EGitee%E5%85%B1%E5%AD%98/

